/**
 * 区间查询出现了偶数次数的值的异或和
 * N=1E6，显然不能用莫队，需要一个NlogN的方法
 * 没有修改操作，可以考虑在一次遍历过程中解决
 * 注意到当某个v值出现以后，以后再碰到v值，无论如何都需要异或，
 * 无论v的数量是奇变偶还是偶变奇
 * 令Pre[v]保存数值v的上一个位置
 * for每个位置i:
 *     令p = Pre[Ai]
 *     如果p不为零说明Ai不是第一次出现，则Bt.modify(p, Ai)，这个操作实际上就是减去Ai
 *     令Pre[Ai] = i
 *     Bt.modify(i, Ai)，这个操作其实就是将Ai建入树状数组
 *     for每一个以i结尾的问题，左边界记作L:
 *         则答案 = S[i] ^ S[L - 1] ^ Bt.query(L, i) *         
 * 因为树状数组中距离当前位置的最后一个数值才有效，即树状数组中每种数值只有一个
 * 如果某个v值在[L, i]中有偶数个，首先S[L...i]中该v值贡献必然为0，其次树状数组中必然有该值，因此异或起来就可以记住该值的贡献
 * 反之，如果v值在[L, i]中有奇数个，则S[L...i]与树状数组异或恰好将该值的贡献剔除。
 * 对与[L...i]中不存在的值，显然树状数组的[L...i]范围内也不会有该值，因此均为零不影响结果
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;

struct FenwickTree{ // 树状数组

using value_type = long long int;
using vec_type = vector<value_type>;

int n;
vec_type c;

FenwickTree() = default;

static int lowbit(int x){return x & -x;}

void init(int nn){this->c.assign((this->n=nn) + 1, 0);}

void modify(int pos, value_type delta){
    for(int i=pos;i<=this->n;i+=lowbit(i)) this->c[i] ^= delta;
}

value_type query(int pos)const{
    value_type ans = 0;
    for(int i=pos;i;i-=lowbit(i)) ans ^= this->c[i];
    return ans;
}

value_type query(int s, int e)const{return this->query(e) ^ this->query(s - 1);}

}Bt;

int N, M;
vector<llt> A, W;
vector<vector<pair<int, int>>> Problem;
vector<llt> Ans;
vector<llt> S;
vector<int> Pre;

void work(){
    cin >> N >> M;
    A.assign(N + 1, 0);
    W.assign(N + 1, 0);
    S.assign(N + 1, 0);
    for(int i=1;i<=N;++i){
        cin >> A[i];
        S[i] = S[i - 1] ^ (W[i] = A[i]);
    }

    sort(W.begin(), W.end());
    W.erase(unique(W.begin(), W.end()), W.end());

    Problem.assign(N + 1, {});
    for(int a,b,i=0;i<M;++i){
        cin >> a >> b;
        Problem[b].emplace_back(i, a);
    }

    Pre.assign(N + 1, 0);
    Ans.assign(M, 0);
    Bt.init(N);
    for(int i=1;i<=N;++i){
       auto v = lower_bound(W.begin(), W.end(), A[i]) - W.begin();
       if(Pre[v]){
           Bt.modify(Pre[v], A[i]);
       }
       Pre[v] = i;
       Bt.modify(i, A[i]);
       for(const auto & p : Problem[i]){
           Ans[p.first] = S[i] ^ S[p.second - 1] ^ Bt.query(p.second, i);
       }       
    }
    for(auto i : Ans) cout << i << "\n";
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}
